/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package presentacion.utilidad;

import hibernate.objeto.DiagnosticoYTriageInternacion;
import hibernate.objeto.EnfermedadYDiagnosticoAmbulatorio;
import hibernate.objeto.Evolucion;
import hibernate.objeto.Farmacologico;
import hibernate.objeto.NoFarmacologico;
import hibernate.objeto.Paciente;
import hibernate.objeto.Persona;
import java.awt.Component;
import javax.swing.JOptionPane;
import logica.CapaLogica;
import logica.PersonaDeContactoLogica;
import logica.TutorLogica;
import presentacion.CapaPresentacion;
import presentacion.acceso.RestriccionAcceso;

/**
 *
 * @author Administrador
 */
public class MensajePresentacion {

    /**
     * Mensaje de input para el ingreso de una cadena de texto.
     *
     * @param msg El mensaje que se presenta en el cuadro
     * @param campoDeEntrada La cadena que se muestra en el campo de entrada
     * @param parentComponent El componente padre
     * @return La cadena de texto ingresada
     */
    public static String ingresoCadenaDeTexto(String msg, String campoDeEntrada,
            Component parentComponent) {
        return JOptionPane.showInputDialog(parentComponent, msg, campoDeEntrada);
    }

    /**
     * Mensaje de error de dato inválido.
     *
     */
    public static void errorDatoInvalido() {
        JOptionPane.showMessageDialog(null,
                    "El dato no es válido.\n" +
                    "Reingrese el dato.",
                    "Error al ingresar dato",
                    JOptionPane.ERROR_MESSAGE);
    }

    /**
     * Mensaje de error de datos inválidos.
     *
     */
    public static void errorDatosInvalidos() {
        JOptionPane.showMessageDialog(null,
                    "Existen datos no válidos o incompletos.\n" +
                    "Revise los campos en rojo.",
                    "Error al ingresar datos",
                    JOptionPane.ERROR_MESSAGE);
    }

    /**
     * Mensaje de error de objeto duplicado.
     *
     * @param parentComponent El componente padre
     * @param msg Las dos primeras palabras del mensaje
     */
    public static void errorDuplicidadObjeto(String msg) {
        String ultimaPalabra = "cargad";
        if (msg.substring(0, 2).equalsIgnoreCase("la")) {
            ultimaPalabra = ultimaPalabra + "a";
        } else if (msg.substring(0, 2).equalsIgnoreCase("el")) {
            ultimaPalabra = ultimaPalabra + "o";
        }

        JOptionPane.showMessageDialog(null,
                    msg + " ya se encuentra " + ultimaPalabra + ".\n"
                    + "Revise los campos.\n",
                    "Error al ingresar datos",
                    JOptionPane.ERROR_MESSAGE);        
    }

    /**
     * Confirmación de la modificación.
     *
     * @param objetoAModificar El objeto a modificar
     * @param msg Las dos primeras palabras del mensaje
     * @return La opción elegida
     */
    public static int confimarModificacionObjeto(String objetoAModificar, String msg) {
        return JOptionPane.showConfirmDialog(null,
                "Desea modificar " + msg + " "
                + objetoAModificar + "?",
                CapaLogica.capitalizeFirstLetter(objetoAModificar),
                JOptionPane.YES_NO_OPTION);
    }
    /**
     * Confirmación de la eliminación.
     *
     * @param objetoAEliminar El objeto a modificar
     * @param msg Las dos primeras palabras del mensaje
     * @return La opción elegida
     */
    public static int confimarEliminacionObjeto(String objetoAEliminar, String msg) {
        String ultimaPalabra = "seleccionad";
        if (msg.substring(0, 2).equalsIgnoreCase("la")) {
            ultimaPalabra = ultimaPalabra + "a";
        } else if (msg.substring(0, 2).equalsIgnoreCase("el")) {
            ultimaPalabra = ultimaPalabra + "o";
        }

        return JOptionPane.showConfirmDialog(null,
                "Desea eliminar " + msg + " "
                + objetoAEliminar + " " + ultimaPalabra + "?",
                CapaLogica.capitalizeFirstLetter(objetoAEliminar),
                JOptionPane.YES_NO_OPTION);
    }

    /**
     * Mensaje de información de alta paciente correcto y además pregunta si
     * quiere completar la información social del paciente.
     *
     * @param paciente El paciente recién agregado/modificado
     */
    public static void confirmarAltaPaciente(Paciente paciente) {
        int opcion = JOptionPane.showConfirmDialog(null,
                "El paciente se agregó/modificó correctamente.\n"
                + "Desea completar la información social asociada?", "Paciente",
                JOptionPane.YES_NO_OPTION);

        if (opcion == JOptionPane.OK_OPTION) {
            RestriccionAcceso.InformacionSocialPacientePresentacion(
                    null, true, paciente.getInformacionSocial());
        }
    }

    /**
     * Mensaje de información de alta paciente correcto y además pregunta si
     * quiere completar la información social del paciente.
     *
     * @return La opción elegida
     */
    public static int confirmarAltaFichaMortalidad() {
        return JOptionPane.showConfirmDialog(null,
                "Se inhabilitaran todas las operaciones de carga\n" +
                "de información del paciente.\n" +
                "Desea continuar?", "Ficha de Mortalidad",
                JOptionPane.YES_NO_OPTION);
    }

    /**
     * Mensaje de confirmación en caso de ser menor de edad.
     *
     * @param persona La persona a modificar
     * @return -1 si no es menor de edad, 0 si es menor de edad y se decide
     * reasignar la persona de contacto, 1 si es menor de edad y no se decide
     * reasignar la persona de contacto, 2 cancelar
     */
    public static int confirmarMenorDeEdad(Persona persona) {
        int opcion = -1;

        if (persona != null &&
                (PersonaDeContactoLogica.esPersonaDeContacto(persona) ||
                TutorLogica.esTutor(persona)) &&
                CapaLogica.esMenor(persona.getFechaDeNacimientoPersona())) {
        opcion = JOptionPane.showConfirmDialog(null,
                "La persona modificada es menor de edad.\n"
                + "Al realizar la operación, debe reasignar la\n"
                + "información de lo/s paciente/s "
                + "afectado/s a ésta.\n" +
                "Desea realizar la operación de todos modos?");
        }

        return opcion;
    }

    /**
     * Mensaje de confirmación en caso de eliminar persona.
     *
     * @param persona La persona a modificar
     * @return 0 Se decide reasignar la persona de contacto, 1 No se decide
     * reasignar la persona de contacto, 2 cancelar
     */
    public static int confirmarReasignarContactosAlEliminarPersona(
            Persona persona) {
        int opcion = -1;
        opcion = JOptionPane.showConfirmDialog(null,
                "La persona a eliminar contiene pacientes asociados.\n"
                + "Al realizar la operación, debe reasignar la\n"
                + "información de lo/s paciente/s "
                + "afectado/s a ésta.\n" +
                "Desea realizar la operación de todos modos?");

        return opcion;
    }

    /**
     * Mensaje de confirmación en caso de que la obra social posea pacientes.
     *
     * @return 0 si se decide eliminar la obra social, 1 si no se decide
     * reasignar la persona de contacto, 2 cancelar
     */
    public static int confirmarEliminacionObraSocialConPacientes() {
        int opcion = -1;
            opcion = JOptionPane.showConfirmDialog(null,
                    "La obra social tiene beneficiarios asignados.\n"
                    + "Al realizar la operación, quedan sin efecto\n"
                    + "dichas prestaciones.\n" +
                    "Desea realizar la operación de todos modos?");

        return opcion;
    }

    /**
     * Mensaje de confirmación en caso de que la persona sea un usuario.
     *
     * @return 0 si se decide eliminar la persona, 1 si no se decide
     * reasignar la persona de contacto, 2 cancelar
     */
    public static int confirmarEliminacionPersonaConUsuario() {
        int opcion = -1;
            opcion = JOptionPane.showConfirmDialog(null,
                    "La persona tiene un usuario asociado.\n" +
                    "Desea realizar la operación de todos modos?");

        return opcion;
    }

    /**
     * Mensaje de información de alta paciente que se presenta cuando la persona
     * que se esta cargando ya se encuentra cargada en la bd y se pregunta si se
     * quiere completar la información.
     *
     * @param parentComponent El componente padre
     * @return true si se quiere completar la pantalla con los datos existentes,
     * false en caso contrario
     */
    public static boolean confirmarPersonaExistente(Component parentComponent) {
        int opcion = JOptionPane.showConfirmDialog(parentComponent,
                "La persona que se está agregando ya existe en el sistema.\n"
                + "Desea completar los datos con la información existente?", "Paciente",
                JOptionPane.YES_NO_OPTION);

        if (opcion == JOptionPane.OK_OPTION) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Mensaje que indica la imposibilidad de efectuar la operación debido a que
     * el usuario ha fallecido.
     *
     */
    public static void informarPacienteFallecido() {
        JOptionPane.showMessageDialog(null,
                "Funcionalidad restringida debido a paciente fallecido.\n" +
                "Por dudas contácte a personal de Sistemas.");
    }

    /**
     * Mensaje que indica la imposibilidad de efectuar la operación debido a que
     * la persona a eliminar es un paciente.
     *
     * @param persona  La persona
     */
    public static void informarImposibilidadOperacionPersonaEsPaciente(Persona persona) {
        JOptionPane.showMessageDialog(null,
                "La operación no se puede realizar debido a que la persona.\n"
                + CapaPresentacion.imprimirApellidoYNombrePersona(persona)
                + " es un paciente activo.\nPor dudas contácte a personal de Sistemas.");
    }

    /**
     * Mensaje de error.
     *
     */
    public static void informarUsuarioRestringido() {
        JOptionPane.showMessageDialog(null,
                "Funcionalidad restringida debido a acceso no autorizado.");
    }

    /**
     * Mensaje de error.
     *
     */
    public static void informarImposibilidadEliminarUsuario() {
        JOptionPane.showMessageDialog(null,
                "El usuario no se puede eliminar.\nPuede deberse a que es Paciente o Usuario activo.");
    }

    /**
     * Mensaje de error. Imposibilidad de eliminar enfermedad.
     *
     */
    public static void informarImposibilidadEliminarEnfermedad() {
        JOptionPane.showMessageDialog(null,
                "La enfermedad no se puede eliminar.\n" +
                    "La misma tiene episodios asignados.");
    }

    /**
     * Mensaje de error. Imposibilidad de eliminar medicamento.
     *
     */
    public static void informarImposibilidadEliminarMedicamento() {
        JOptionPane.showMessageDialog(null,
                "El medicamento no se puede eliminar.\n" +
                    "El mismo tiene farmacos o aplicaciones de vacunas asociadas.");
    }

    /**
     * Mensaje de error. Contacto no habilitado para realizar una tarea.
     *
     */
    public static void informarContactoNoHabilitado() {
        JOptionPane.showMessageDialog(null,
                "Seleccione un contacto habilitado para esta tarea.\n"
                + "Se debe tener en cuenta lo suguiente:\n"
                + "No se pueden eliminar un contacto que sea paciente.\n"
                + "Los contactos pacientes deben estar vivos.\n"
                + "Las contactos deben ser distintos al paciente que se quiere vincular,\n"
                + "ademas dichos contactos, deben ser mayores de edad.");
    }

    /**
     * Mensaje de error. Correo electrónico no enviado.
     *
     */
    public static void informarCorreoElectronicoNoEnviado() {
        JOptionPane.showMessageDialog(null,
                "El correo electrónico no pudo ser enviado.\n" +
                                "Por favor contacte al administrador.");
    }
    /**
     * Mensaje de error. Correo electrónico no perteneciente a usuario activo.
     *
     */
    public static void informarCorreoElectronicoNoPerteneceAUsuarioActivo() {
        JOptionPane.showMessageDialog(null,
                "El correo electrónico no pertenece\n" +
                            "a ningún usuario activo.");
    }

    /**
     * Mensaje de error. Correo electrónico no perteneciente a usuario activo.
     *
     */
    public static void informarNombreUsuarioIncorrecto() {
        JOptionPane.showMessageDialog(null,
                "El nombre de usuario es incorrecto.");
    }

    /**
     * Mensaje de error. Correo electrónico no perteneciente a usuario activo.
     *
     */
    public static void informarClaveIncorrecta() {
        JOptionPane.showMessageDialog(null,
                "La clave es incorrecta.");
    }

    /**
     * Mensaje de error.
     *
     * @param El objeto
     */
    public static void informarEntidadNoActiva(Object objeto) {
        String entidad = "";
        
        if (objeto instanceof EnfermedadYDiagnosticoAmbulatorio) {
            entidad = "La enfermedad";
            
        } else if (objeto instanceof DiagnosticoYTriageInternacion) {
            entidad = "La internación";
            
        } else if (objeto instanceof Evolucion) {
            if (((Evolucion) objeto).getEnfermedadYDiagnosticoAmbulatorio() != null) {
                entidad = "La enfermedad";
            } else if (((Evolucion) objeto).getDiagnosticoYTriageInternacion() != null) {
                entidad = "La internación";
            }
            
        } else if (objeto instanceof Farmacologico) {
            entidad = "El tratamiento farmacológico";
        } else if (objeto instanceof NoFarmacologico) {
            entidad = "El tratamiento no farmacológico";
        }
        
        JOptionPane.showMessageDialog(null,
                entidad + " se encuentra finalizada\\o por lo que no\n" +
                "es posible realizar la operación");
    }

    /**
     * Mensaje de error.
     *
     * @param entidadAsociada La entidad asociada
     * @param objeto El objeto en si
     */
    public static void informarEntidadAsociadaNula(String entidadAsociada, String objeto) {
        JOptionPane.showMessageDialog(null,
                "Debe cargar " + entidadAsociada +
                " antes de cargar " + objeto + ".");
    }

}

